package com.mach.platform.utils;

import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author: Administrator
 * @program: boyer  递归树形数据
 * @description: ${description}
 * @create: 2018-10-13 21:59
 **/
public interface RecurFactory<T> {
    /**
     * 停止递归条件
     *
     * @param son    子数据
     * @param father 父数据
     * @return
     */
    boolean finish (T son, T father);

    /**
     * 返回子数据
     *
     * @param t      子数据s
     * @param father 当前父数据
     */
    void handleChildren (List<T> t, T father);

    /**
     * 特殊定制，这里需要对子数据 进行排序
     *
     * @return
     */
    Comparator<T> sortMethod ( );

    /**
     * 调用个方法进行递归
     *
     * @param datas 数据源
     * @param t     最顶层的父数据
     * @return
     */
    default T build (List<T> datas, T t) {
        //提取子数据
        List<T> children = datas.stream().filter(item -> finish(item, t)).sorted(sortMethod()).collect(Collectors.toList());

        if (children.size() != 0) {
            // 含有子数据 继续递归
            handleChildren(children, t);
            children.forEach(item -> build(datas, item));
        }
        return t;
    }
}
